/*****************************************************************************/
/*                        >>> PPD_CONSOLA.C-- <<<                            */
/*	Trabajo Practico 2do. cuatrimestre 2011                                  */
/*	TP:"FUSELAJE"                                                            */
/*	GRUPO: Reduce Fat Fast                                                   */
/*	INTEGRANTES: Emanuel Genovese                                            */
/*               Federico Gabriel Garcia                                     */
/*               Federico Pioli                                              */
/*               Esther Insfrain                                             */
/*               Luciano Bagattin                                            */
/*	Fecha UM:                                                                */
/*****************************************************************************/
/*****************************************************************************/
/*		        	HEADERS					                                 */
/*****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
#include <time.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <sys/un.h>
#include <fcntl.h>
#include <errno.h>
#include "func_socket.h"
#include "log.h"
#include "func_strings.h"
#include "../headers/func_pantalla.h"
#include "../headers/constantes.h"
#include "../headers/func_consola.h"
#include "../headers/prototipos.h"
#include "structs_commons.h"

/************************Desarollo del prog pcpal************************************/

int main(int argc, char *argv[]) {
	/*comienzo de declaracion de variables globales*/
	int iInstruccion;
	char sSectores[1024] = "\0";
	char sCadenaLog[4000] = "\0";
	char sCadena[1024] = "\0";
	t_log *log = log_create("Runner", LOG, DEBUG | INFO | WARNING,
			M_CONSOLE_DISABLE);
	int iSocket, iSectorInicial, iSectorFinal, iResultado = 1,
			iCantSectoresBorrados, iCantSectoresNoBorrados;

	char sSectoresBorrados[1024], sSectoresNoBorrados[1024];
	int iSector;
	vecTrace vPosCab;
	stPEscrituraSector stPE;
	stRLecturaSector stLS;
	stREscrituraSector stES;
	int vTrace[5];
	int iCant = 0;
	int iVariable;


	/*fin de la declaracion de variables globales*/

	memset(sSectores, '\0', 1024);
	if (argc != 2) {
		printf(
				"Error en el ingreso de parametros de ejecucion ./PPD_CONSOLA <PUERTO>");
		log_error(
				log,
				NOMBREPROCESO,
				"Message error: %s",
				"Error en la ejecucion del programa ingreso mal los parametros");
		log_destroy(log);
		exit(1);

	} //fin del argc
	 getchar();
	iSocket = fPrepararSocket_UN(log, NOMBREPROCESO);
	sleep(4);
	fConectar_UN(iSocket, NOMBREPROCESO, log, argv[1]);
	memset(sSectoresBorrados, '\0', 1024);
	memset(sSectoresNoBorrados, '\0', 1024);

	fflush(stdin);
	while (iInstruccion != 6) {
		pMenu();

		printf("\n");
		scanf("%d", &iInstruccion);

		switch (iInstruccion) {

		case 1:/*Imprimo la posicion del cabezal */
			fflush(stdin);
			iVariable = getchar();

			puts("*1:-Info");

			fflush(stdin);
			if (fAtenderPosicionCabezal(iSocket, &vPosCab, log) == -1) {
				log_error(log, NOMBREPROCESO, "Message error: %s",
						"Error en la atencion en el pedido del cabezal");
				log_destroy(log);
				return -1;
			} //fin del if

			sprintf(sCadena, "La posicion del cabezal es Pista:%d Sector:%d",
					vPosCab.iPista, vPosCab.iSector);

			log_info(log, NOMBREPROCESO, "Message Info: %s", sCadena);

			puts(sCadena);

			puts("Aprete cualquier tecla para volver al menu principal");
			fflush(stdin);

			iVariable = getchar();

			break;
		case 2:/*Borro los sectores que quiero borrar*/
			do {
				puts("*2:-CLEAN");
				puts("Ingrese el sector desde el cual quiere borrar");
				fflush(stdin);
				scanf("%d", &iSectorInicial);
				puts("Ingrese el sector hasta el cual quiere borrar");
				fflush(stdin);
				scanf("%d", &iSectorFinal);
				iResultado = fVerificaSectores(iSectorInicial, iSectorFinal);
			} while (iResultado);
			if (!fAtenderClean(iSocket, iSectorInicial, iSectorFinal,
					sSectoresBorrados, sSectoresNoBorrados,
					&iCantSectoresBorrados, &iCantSectoresNoBorrados, log)) {
				log_destroy(log);
				return -1;
			} //fin del if
			memset(sCadenaLog, '\0', 4000);
			sprintf(sCadenaLog, "%s%s", "Se borraron los sectores",
					sSectoresBorrados);
			puts(sCadenaLog);
			log_info(log, NOMBREPROCESO, "Message info: %s", sCadenaLog);
			if (iCantSectoresNoBorrados > 0) {

				memset(sCadenaLog, '\0', 4000);
				sprintf(sCadenaLog, "%s%s", "No Se borraron los sectores",
						sSectoresNoBorrados);
				puts(sCadenaLog);
				log_info(log, NOMBREPROCESO, "Message info: %s", sCadenaLog);
			}
			fflush(stdin);
			getchar();
			puts("Aprete cualquier tecla para volver al menu principal");
			fflush(stdin);
			getchar();
			break;
		case 3:/*Imprime la informacion traceada */
			do {
				printf("*3:-TRACE\n");

				printf(
						"Ingrese los sectores de los cuales necesita saber la informacion\n");
				printf(
						"Ingreselos en el formato (sector1,sector2,sector3,sector4,sector5)\n");
				fflush(stdin);
				scanf("%s", sSectores);

				iResultado = fVerificarCadena(sSectores);
				if (iResultado == 1) {
					printf(
							"Estan mal ingresados los sectores que desea obtener\n");
					printf(
							"\nAprete cualquier tecla para volver al menu principal\n");
				} //fin del if

				if (iResultado == 2) {
					printf("La cantidad de sectores ingresados supera los 5");
					printf(
							"\nAprete cualquier tecla para volver al menu principal\n");
				} //fin del if

				if ((iResultado == 1) || (iResultado == 2)) {
					fflush(stdin);
					getchar();
					system("clear");
				}
			} while (iResultado);
			pConvierteSectores(sSectores, vTrace, &iCant);
			if (fAtenderTrace(iSocket, vTrace, iCant, log) == -1) {
				log_error(log, NOMBREPROCESO, "Message error: %s",
						"Error en la atencion del trace");
				log_destroy(log);
				return -1;
			} //fin del atencion del trace.

			fflush(stdin);
			getchar();
			printf("Aprete cualquier tecla para volver al menu principal\n");
			fflush(stdin);
			getchar();
			break;
		case 4:
			/*Escribir sector*/
			printf("*4:-ESCRIBIR SECTOR\n");
			printf(
					"Ingrese el sector los sectores de los cuales necesita saber la informacion\n");
			fflush(stdin);
			scanf("%d", &stPE.iSector);
			memset(stPE.info, '\0', 512);
			printf(
					"Ingrese el contenido que desea escribir en el sector ingresado\n");
			fflush(stdin);
			scanf("%s", stPE.info);

			if (fAtenderEscribirSector(iSocket, stPE, &stES, log) == -1) {
				memset(sCadenaLog, '\0', 4000);
				sprintf(sCadenaLog,"%s%d",
						"Error en la atencion de la escritura del sector ",
						stPE.iSector);
				log_error(log, NOMBREPROCESO, "Message error: %s", sCadenaLog);
				log_destroy(log);
				return -1;
			}
			if (stES.iRespuesta == OPERACION_OK) {
				memset(sCadenaLog, '\0', 4000);
				sprintf(sCadenaLog, "%s%d%s", "Se escribio el sector ",
						stES.iSector, " en forma exitosa");
				puts(sCadenaLog);
				log_info(log, NOMBREPROCESO, "Message info: %s", sCadenaLog);

			} else {
				memset(sCadenaLog, '\0', 4000);
				sprintf(sCadenaLog, "%s%d", "No se escribio el sector ",
						stES.iSector);
				puts(sCadenaLog);
				log_info(log, NOMBREPROCESO, "Message info: %s", sCadenaLog);

			}
			fflush(stdin);
			getchar();

			printf("Aprete cualquier tecla para volver al menu principal\n");
			fflush(stdin);
			getchar();

			break;
		case 5:
			/*Leer sector*/
			printf("*5:-LEER SECTOR\n");
			printf("Ingrese el sector que necesita saber su contenido\n");
			fflush(stdin);
			scanf("%d", &iSector);
			if (fAtenderLeerSector(iSocket, iSector, &stLS, log) == -1) {
				memset(sCadenaLog, '\0', 4000);
				sprintf(sCadenaLog, "%s%d",
						"Error en la atencion de la lecttura del sector ",
						iSector);
				log_error(log, NOMBREPROCESO, "Message error: %s", sCadenaLog);
				log_destroy(log);
				return -1;
			}
			if (stLS.iRespuesta == OPERACION_OK) {
				memset(sCadenaLog, '\0', 4000);
				sprintf(sCadenaLog, "%s%d%s", "Se leyo  el sector:",
						stLS.iSector, " en forma exitosa y su contenido es:");
				strcat(sCadenaLog,stLS.info);

				puts(sCadenaLog);
				log_info(log, NOMBREPROCESO, "Message info: %s", sCadenaLog);

			} else {
				sprintf(sCadenaLog, "%s%d", "No se pudo leer el sector:",
						stLS.iSector);
				puts(sCadenaLog);
				log_error(log, NOMBREPROCESO, "Message Error: %s", sCadenaLog);
				log_destroy(log);
				return -1;

			}

			fflush(stdin);
			getchar();
			printf("Aprete cualquier tecla para volver al menu principal\n");
			fflush(stdin);
			getchar();
			break;
		} //fin del swich

	} //fin del while

	return 0;
}
